﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;

namespace SVC_DAL
{
    public class VendasDAL
    {
        Dados objD = null;

        public VendasDAL()
        { }

        //inserção
        public int inserir(int cliente, DateTime data_venda, int funcionario, int forma_pagamento,
            int parcelas, Double valor, String observacao, Double percentual_desconto,
            Double desconto, Double ven_valorFinal,String ven_status, String ven_tipo)
        {
            SqlCommand cmd = null;
            try
            {
                int codigo = 0;
                objD = new Dados();
                cmd = new SqlCommand();
                cmd.CommandText = "INSERT INTO Vendas" +
                    "(ven_cliente, ven_dataVenda, ven_usuario, ven_formaPagamento, ven_qtdParcelas, ven_valorTotal, ven_observacao, "+
                    " ven_desconto, ven_percentualDesconto,ven_valorFinal,ven_status,ven_tipo)" +
                    " VALUES (@cliente, @data, @usuario, @forma_pagto, @parcelas, @total, @obs, @desconto, @percentual_desc,@ven_valorFinal,@ven_status,@ven_tipo)";
                cmd.Parameters.Add(new SqlParameter("@cliente", SqlDbType.Int)).Value = cliente;
                cmd.Parameters.Add(new SqlParameter("@data", SqlDbType.DateTime)).Value = data_venda;
                cmd.Parameters.Add(new SqlParameter("@usuario", SqlDbType.Int)).Value = funcionario;
                if(forma_pagamento == 0)
                    cmd.Parameters.Add(new SqlParameter("@forma_pagto", SqlDbType.Int)).Value = DBNull.Value;
                else
                    cmd.Parameters.Add(new SqlParameter("@forma_pagto", SqlDbType.Int)).Value = forma_pagamento;
                if(parcelas == 0)
                    cmd.Parameters.Add(new SqlParameter("@parcelas", SqlDbType.Int)).Value = DBNull.Value;
                else
                    cmd.Parameters.Add(new SqlParameter("@parcelas", SqlDbType.Int)).Value = parcelas;
                cmd.Parameters.Add(new SqlParameter("@total", SqlDbType.Float)).Value = valor;
                if (observacao != null && observacao != "")
                    cmd.Parameters.Add(new SqlParameter("@obs", SqlDbType.VarChar)).Value = observacao;
                else
                    cmd.Parameters.Add(new SqlParameter("@obs", SqlDbType.VarChar)).Value = DBNull.Value;
                cmd.Parameters.Add(new SqlParameter("@desconto", SqlDbType.Float)).Value = desconto;
                cmd.Parameters.Add(new SqlParameter("@percentual_desc", SqlDbType.Float)).Value = percentual_desconto;
                cmd.Parameters.Add(new SqlParameter("@ven_valorFinal", SqlDbType.Float)).Value = ven_valorFinal;
                cmd.Parameters.Add(new SqlParameter("@ven_status", SqlDbType.VarChar)).Value = ven_status;
                cmd.Parameters.Add(new SqlParameter("@ven_tipo", SqlDbType.VarChar)).Value = ven_tipo;
                codigo = objD.executacomandoInsert(cmd,"Vendas");
                cmd = null;
                objD = null;
                return codigo;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        //alterar
        public void alterar(int codigo, int cliente, DateTime data_venda, int funcionario, int forma_pagamento,
            int parcelas, Double valor, String observacao, Double percentual_desconto, Double desconto, 
            Double ven_valorFinal,String ven_status, String ven_tipo)
        {
            SqlCommand cmd = null;
            try
            {
                objD = new Dados();
                cmd = new SqlCommand();
                cmd.CommandText = "UPDATE Vendas" +
                    " SET ven_cliente=@cliente,ven_dataVenda=@data," +
                    " ven_usuario=@usuario," +
                    " ven_formaPagamento=@forma_pagto,ven_qtdParcelas=@parcelas," +
                    " ven_valorTotal=@total,ven_observacao=@obs," +
                    " ven_desconto = @desconto, ven_percentualDesconto = @percentual_desc,"+
                    " ven_valorFinal=@ven_valorFinal, ven_status=@ven_status, ven_tipo=@ven_tipo" +
                    " WHERE" +
                    " ven_codigo=@codigo";
                cmd.Parameters.Add(new SqlParameter("@codigo", SqlDbType.Int)).Value = codigo;
                cmd.Parameters.Add(new SqlParameter("@cliente", SqlDbType.Int)).Value = cliente;
                cmd.Parameters.Add(new SqlParameter("@data", SqlDbType.DateTime)).Value = data_venda;
                cmd.Parameters.Add(new SqlParameter("@usuario", SqlDbType.Int)).Value = funcionario;
                if (forma_pagamento == 0)
                    cmd.Parameters.Add(new SqlParameter("@forma_pagto", SqlDbType.Int)).Value = DBNull.Value;
                else
                    cmd.Parameters.Add(new SqlParameter("@forma_pagto", SqlDbType.Int)).Value = forma_pagamento;
                if (parcelas == 0)
                    cmd.Parameters.Add(new SqlParameter("@parcelas", SqlDbType.Int)).Value = DBNull.Value;
                else
                    cmd.Parameters.Add(new SqlParameter("@parcelas", SqlDbType.Int)).Value = parcelas;
                cmd.Parameters.Add(new SqlParameter("@total", SqlDbType.Float)).Value = valor;
                if (observacao != null && observacao != "")
                    cmd.Parameters.Add(new SqlParameter("@obs", SqlDbType.VarChar)).Value = observacao;
                else
                    cmd.Parameters.Add(new SqlParameter("@obs", SqlDbType.VarChar)).Value = DBNull.Value;
                cmd.Parameters.Add(new SqlParameter("@desconto", SqlDbType.Float)).Value = desconto;
                cmd.Parameters.Add(new SqlParameter("@percentual_desc", SqlDbType.Float)).Value = percentual_desconto;
                cmd.Parameters.Add(new SqlParameter("@ven_valorFinal", SqlDbType.Float)).Value = ven_valorFinal;
                cmd.Parameters.Add(new SqlParameter("@ven_status", SqlDbType.VarChar)).Value = ven_status;
                cmd.Parameters.Add(new SqlParameter("@ven_tipo", SqlDbType.VarChar)).Value = ven_tipo;
                objD.executacomando(cmd);
            }
            catch (Exception ex)
            {

                throw ex;
            }
            cmd = null;
            objD = null;
        }

        //alterar
        public void cancelarVenda(int ven_codigo, String ven_status)
        {
            SqlCommand cmd = null;
            try
            {
                objD = new Dados();
                cmd = new SqlCommand();
                cmd.CommandText = "UPDATE Vendas" +
                    " SET ven_status = @ven_status" +
                    " WHERE" +
                    " ven_codigo=@ven_codigo";
                cmd.Parameters.Add(new SqlParameter("@ven_codigo", SqlDbType.Int)).Value = ven_codigo;
                cmd.Parameters.Add(new SqlParameter("@ven_status", SqlDbType.VarChar)).Value = ven_status;
                objD.executacomando(cmd);
            }
            catch (Exception ex)
            {

                throw ex;
            }
            cmd = null;
            objD = null;
        }

        //alterar
        public void alterarTipoVenda(int ven_codigo, int ven_formaPagamento, int ven_qtdParcelas,String ven_tipo)
        {
            SqlCommand cmd = null;
            try
            {
                objD = new Dados();
                cmd = new SqlCommand();
                cmd.CommandText = "UPDATE Vendas" +
                    " SET ven_formaPagamento = @ven_formaPagamento, ven_qtdParcelas = @ven_qtdParcelas,ven_tipo = @ven_tipo" +
                    " WHERE" +
                    " ven_codigo=@ven_codigo";
                cmd.Parameters.Add(new SqlParameter("@ven_codigo", SqlDbType.Int)).Value = ven_codigo;
                cmd.Parameters.Add(new SqlParameter("@ven_formaPagamento", SqlDbType.Int)).Value = ven_formaPagamento;
                cmd.Parameters.Add(new SqlParameter("@ven_qtdParcelas", SqlDbType.Int)).Value = ven_qtdParcelas;                
                cmd.Parameters.Add(new SqlParameter("@ven_tipo", SqlDbType.VarChar)).Value = ven_tipo;
                objD.executacomando(cmd);
            }
            catch (Exception ex)
            {

                throw ex;
            }
            cmd = null;
            objD = null;
        }

        
        public void excluir(int codigo)
        {
            SqlCommand cmd = null;
            try
            {
                objD = new Dados();
                cmd = new SqlCommand();
                cmd.CommandText = "DELETE FROM Vendas" +
                    " WHERE" +
                    " ven_codigo=@codigo";
                cmd.Parameters.Add(new SqlParameter("@codigo", SqlDbType.Int)).Value = codigo;
                objD.executacomando(cmd);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            cmd = null;
            objD = null;
        }

        //selecionar várias linhas
        public DataTable localizar(String descricao, String coluna)
        {
            DataTable tab = null;
            SqlCommand cmd = null;
            try
            {
                objD = new Dados();
                cmd = new SqlCommand();
                cmd.CommandText = "SELECT * FROM Vendas" +
                    " WHERE " + coluna + " like @descricao";
                cmd.Parameters.Add(new SqlParameter("@descricao",
                    SqlDbType.VarChar)).Value = descricao + "%";
                tab = objD.executaconsulta(cmd);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            cmd = null;
            objD = null;
            return tab;
        }

        public DataTable localizarLeave(String descricao, String coluna)
        {
            DataTable tab = null;
            SqlCommand cmd = null;
            try
            {
                objD = new Dados();
                cmd = new SqlCommand();
                cmd.CommandText = "SELECT * FROM Vendas" +
                    " WHERE " + coluna + " like @descricao";
                cmd.Parameters.Add(new SqlParameter("@descricao",
                    SqlDbType.VarChar)).Value = descricao;
                tab = objD.executaconsulta(cmd);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            cmd = null;
            objD = null;
            return tab;
        }

        public DataTable verificaLimiteClienteMensal(int cli_codigo)
        {
            DataTable tab = null;
            SqlCommand cmd = null;
            try
            {
                objD = new Dados();
                cmd = new SqlCommand();
                cmd.CommandText = "SELECT SUM(cr.cr_valorAlterado) 'Valor Total do Devedor' "+
                                "FROM Cliente c "+
	                            "INNER JOIN vendas v on c.cli_codigo = v.ven_cliente "+
	                            "INNER JOIN ContasAReceber cr on v.ven_codigo= cr.cr_vendas "+
								"WHERE c.cli_codigo = @descricao and v.ven_dataVenda < GETDATE() and v.ven_dataVenda > GETDATE() - 30 and cr.cr_status <> 'Pago' "+
								"GROUP BY c.cli_limiteMensal "+
                                "having c.cli_limiteMensal < SUM(cr.cr_valorAlterado)";
                cmd.Parameters.Add(new SqlParameter("@descricao",
                    SqlDbType.Int)).Value = cli_codigo;
                tab = objD.executaconsulta(cmd);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            cmd = null;
            objD = null;
            return tab;
        }

        public DataTable verificaLimiteClienteTotal(int cli_codigo)
        {
            DataTable tab = null;
            SqlCommand cmd = null;
            try
            {
                objD = new Dados();
                cmd = new SqlCommand();
                cmd.CommandText = "SELECT SUM(cr.cr_valorAlterado) 'Valor Total do Devedor' " +
                                "FROM Cliente c " +
                                "INNER JOIN vendas v on c.cli_codigo = v.ven_cliente " +
                                "INNER JOIN ContasAReceber cr on v.ven_codigo= cr.cr_vendas " +
                                "WHERE c.cli_codigo = @descricao " +
                                "GROUP BY c.cli_limiteCredito " +
                                "HAVING  c.cli_limiteCredito < SUM(cr.cr_valorAlterado)";
                cmd.Parameters.Add(new SqlParameter("@descricao",
                    SqlDbType.Int)).Value = cli_codigo;
                tab = objD.executaconsulta(cmd);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            cmd = null;
            objD = null;
            return tab;
        }

        //selecionar uma linha - um código
        public int localizar(int codigo)
        {
            DataTable tab = null;
            SqlCommand cmd = null;

            try
            {
                objD = new Dados();
                cmd = new SqlCommand();
                cmd.CommandText = "SELECT * FROM Vendas" +
                    " WHERE ven_codigo = @codigo";
                cmd.Parameters.Add(new SqlParameter("@codigo",
                    SqlDbType.Int)).Value = codigo;
                tab = objD.executaconsulta(cmd);
                cmd = null;
                objD = null;
                if (tab.Rows.Count > 0)
                    return int.Parse(tab.Rows[0][0].ToString());
                else
                    return 0;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public DataTable localizarEmTudo(String descricao)
        {
            DataTable tab = null;
            SqlCommand cmd = null;
            try
            {
                objD = new Dados();
                cmd = new SqlCommand();

                cmd.CommandText = "SELECT v.ven_codigo'Código da Venda',"  +
                                   "CASE WHEN (c.cli_tipo_pessoa = 'Pessoa Física') THEN c.cli_nome ELSE c.cli_razao_social END 'Cliente', " +
	                               "v.ven_dataVenda 'Data da Venda',u.usu_nome 'Funcionário', fp.fp_descricao 'Forma de Pagamento', "+
	                               "v.ven_qtdParcelas 'Quantidade de Pacerlas', v.ven_valorTotal 'Subtotal da Venda', v.ven_desconto 'Desconto (R$)', "+
	                               "v.ven_percentualDesconto 'Desconto (%)',ven_valorFinal'Valor Final',v.ven_tipo 'Tipo da Venda',v.ven_observacao 'Observacao' "+
                            "FROM Vendas v  "+
	                             "LEFT JOIN Usuario u ON v.ven_usuario = u.usu_codigo  "+
                                 "LEFT JOIN Cliente c ON v.ven_cliente= c.cli_codigo "+
	                             "LEFT JOIN FormaPagamento fp ON v.ven_formaPagamento = fp.fp_codigo "+
                            "WHERE c.cli_nome like @descricao or c.cli_razao_social like @descricao or v.ven_codigo like @descricao";
                cmd.Parameters.Add(new SqlParameter("@descricao",
                    SqlDbType.VarChar)).Value = "%" + descricao + "%";

                tab = objD.executaconsulta(cmd);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            cmd = null;
            objD = null;
            return tab;
        }

        public DataTable localizarPrimeiroUltimo(String descricao)
        {
            DataTable tab = null;
            SqlCommand cmd = null;

            try
            {
                objD = new Dados();
                cmd = new SqlCommand();
                if (descricao == "ultimo")
                {
                    cmd.CommandText = "SELECT ven_codigo = max(ven_codigo) FROM Vendas";
                    cmd.Parameters.Add(new SqlParameter("@descricao",
                         SqlDbType.VarChar)).Value = descricao;
                }
                else if (descricao == "primeiro")
                {
                    cmd.CommandText = "SELECT ven_codigo = min(ven_codigo) FROM Vendas";
                    cmd.Parameters.Add(new SqlParameter("@descricao",
                     SqlDbType.VarChar)).Value = descricao;
                }
                tab = objD.executaconsulta(cmd);

            }
            catch (Exception)
            {

                throw;
            }
            return tab;
        }

        public DataTable localizarProxAnterior(String descricao, int codigo)
        {
            DataTable tab = null;
            SqlCommand cmd = null;

            try
            {
                objD = new Dados();
                cmd = new SqlCommand();
                if (descricao == "proximo")
                    cmd.CommandText = "SELECT ven_codigo FROM Vendas WHERE ven_codigo = (SELECT MIN(ven_codigo) FROM Vendas WHERE ven_codigo > @codigo)";

                else if (descricao == "anterior")
                    cmd.CommandText = "SELECT ven_codigo FROM Vendas WHERE ven_codigo = (SELECT MAX(ven_codigo) FROM Vendas WHERE ven_codigo < @codigo)"; ;

                cmd.Parameters.Add(new SqlParameter("@codigo", SqlDbType.Int)).Value = codigo;

                tab = objD.executaconsulta(cmd);
            }
            catch (Exception)
            {

                throw;
            }
            return tab;
        }

        public DataTable vendasDia()
        {
            DataTable tab = null;
            SqlCommand cmd = null;
            try
            {
                objD = new Dados();
                cmd = new SqlCommand();
                cmd.CommandText = "SELECT SUM(v.ven_valorTotal) " +
                                "FROM vendas v WHERE v.ven_dataVenda = GETDATE()";
                tab = objD.executaconsulta(cmd);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            cmd = null;
            objD = null;
            return tab;
        }

        public DataTable FormarCupom(int venda)
        {
            DataTable tab = null;
            SqlCommand cmd = null;
            try
            {
                objD = new Dados();
                cmd = new SqlCommand();
                cmd.CommandText = "sp_cupom"; //Procedure
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.Add(new SqlParameter("@venda", SqlDbType.Int)).Value = venda;
                tab = objD.executaconsulta(cmd);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            cmd = null;
            objD = null;
            return tab;
        }

    }
}
